//给你一个长度为 n 的整数数组 nums，其中 n > 1，返回输出数组 output ，其中 output[i] 等于 nums 中除 nums[i] 之
//外其余各元素的乘积。 
//
// 
//
// 示例: 
//
// 输入: [1,2,3,4]
//输出: [24,12,8,6] 
//
// 
//
// 提示：题目数据保证数组之中任意元素的全部前缀元素和后缀（甚至是整个数组）的乘积都在 32 位整数范围内。 
//
// 说明: 请不要使用除法，且在 O(n) 时间复杂度内完成此题。 
//
// 进阶： 
//你可以在常数空间复杂度内完成这个题目吗？（ 出于对空间复杂度分析的目的，输出数组不被视为额外空间。） 
// Related Topics 数组 
// 👍 564 👎 0

  
package com.yun.leetcode.editor.cn;

import java.util.Arrays;

public class ProductOfArrayExceptSelf {
    public static void main(String[] args) {
        Solution solution = new ProductOfArrayExceptSelf().new Solution();
        solution.productExceptSelf(new int[]{2, 4, 6, 8, 10});
    }
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int[] productExceptSelf(int[] nums) {
        // 从左向右，先乘左半后乘右半
        // 先记录当前数左半边的值，计算到最后一位。再记录当前数右半边的值，从后往前
        int[] result = new int[nums.length];
        int left = 1;
        int right = 1;
        for(int i=0; i<nums.length; i++){
            result[i] = left;
            left *= nums[i];// 乘上以后赋给下一个数组
        }
        System.out.println(Arrays.toString(result));
        for(int j=nums.length-1; j>=0; j--){
            result[j] *= right;
            right *= nums[j];
        }
        System.out.println(Arrays.toString(result));
        return result;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}